package AI;

import java.util.Stack;

import net.datastructures.Edge;
import net.datastructures.NodePositionList;
import net.datastructures.Vertex;


import elementos.Player;
import enemies.Enemy;

import mapControl.Celda;
import ED.GraphImp;
import ED.MyVertex;

public class FindMinPathDFS<V, E> {

	protected Object ESTADO = new Object();
	protected Object NOVISITADO = new Object();
	protected Object VISITADO = new Object();

	private NodePositionList<NodePositionList<Vertex<V>>> listaCaminos;
	private NodePositionList<Vertex<V>> path;
	private GraphImp<V, E> graph;

	public FindMinPathDFS() {

	}

	public NodePositionList<Vertex<V>> obtenerCamino(
			GraphImp<V, E> graph, Vertex<Celda> origen,
			Vertex<V> destino) {

		this.graph = graph;
		listaCaminos = new NodePositionList<NodePositionList<Vertex<V>>>();
		path = new NodePositionList<Vertex<V>>();
		limpiarGrafo();
		search((MyVertex<V, E>) origen, destino);
		NodePositionList<Vertex<V>> best = null;
		if (!listaCaminos.isEmpty()){
		best = listaCaminos.first().element();
		for (NodePositionList<Vertex<V>> aux : listaCaminos) {
			if (best.size() > aux.size()) {
				best = aux;
			}
		}}

		return best;
	}

	private void limpiarGrafo() {
		for (Vertex<V> v : graph.vertices()) {
			v.put(ESTADO, NOVISITADO);
		}
		for (Edge<E> e : graph.edges()) {
			e.put(ESTADO, NOVISITADO);
		}

	}

	private void search(MyVertex<V, E> origen, Vertex<V> destino) {
		origen.put(ESTADO, VISITADO);
		path.addLast(origen);
		if (origen == destino) {
			NodePositionList<Vertex<V>> newPath = new NodePositionList<Vertex<V>>();
			for (Vertex<V> v: path)
			{
				newPath.addLast(v);
			}
			
			listaCaminos.addLast(newPath);
		}

		else {

			for (Edge<E> camino : origen.getAdjacencyList()) {
				if (camino.get(ESTADO) == NOVISITADO) {
					camino.put(ESTADO, VISITADO);
					MyVertex<V, E> newOrigen = (MyVertex<V, E>) graph
							.opposite(origen, camino);
					search(newOrigen, destino);
					path.remove(path.last());
				//	camino.put(ESTADO, NOVISITADO);
				}
			}
		}

	}

}
